V8 JavaScriptãšã³ãžã³ãææ©çæé©åãå©çšããŠã³ãŒãã®ããã©ãŒãã³ã¹ãåäžãããäžçäžã®ãŠãŒã¶ãŒã«ã¹ã ãŒãºã§å¿çæ§ã®é«ããŠã§ãäœéšãæäŸããæ¹æ³ãæ¢ããŸãã
JavaScript V8ã®ææ©çæé©åïŒé«éãªãŠã§ããå®çŸããäºæž¬çã³ãŒã匷å
é²åãç¶ãããŠã§ãéçºã®äžçã«ãããŠãããã©ãŒãã³ã¹ã¯æãéèŠã§ããè³ãããªéœåžã®äžå¿éšããé ãé¢ãã蟲æå°åã«è³ããŸã§ãäžçäžã®ãŠãŒã¶ãŒã¯é«éã«èªã¿èŸŒãŸããå¿çæ§ã®é«ããŠã§ãã¢ããªã±ãŒã·ã§ã³ãæ±ããŠããŸãããããéæããããã®éèŠãªèŠçŽ ã¯ããããã®ã¢ããªã±ãŒã·ã§ã³ãåããJavaScriptãšã³ãžã³ã®å¹çæ§ã§ãããã®ããã°èšäºã§ã¯ãGoogle ChromeãNode.jsãæ¯ããV8 JavaScriptãšã³ãžã³ã䜿çšããéèŠãªæé©åæè¡ã§ãããææ©çæé©åãã«ã€ããŠæãäžããŸãããã®äºæž¬çãªã³ãŒã匷åã¢ãããŒãããäžçäžã®ãŠãŒã¶ãŒã«ãšã£ãŠããã¹ã ãŒãºã§å¿çæ§ã®é«ããŠã§ãäœéšã«ã©ã®ããã«è²¢ç®ããŠããããæ¢ããŸãã
JavaScriptãšã³ãžã³ãšæé©åã®çè§£
ææ©çæé©åã«é£ã³èŸŒãåã«ãJavaScriptãšã³ãžã³ã®åºæ¬ãšã³ãŒãæé©åã®å¿ èŠæ§ãçè§£ããããšãäžå¯æ¬ ã§ããåçã§å€æ©èœãªèšèªã§ããJavaScriptã¯ããããã®ãšã³ãžã³ã«ãã£ãŠå®è¡ãããŸãã人æ°ã®ãããšã³ãžã³ã«ã¯ãV8ãSpiderMonkeyïŒFirefoxïŒãJavaScriptCoreïŒSafariïŒãªã©ããããŸãããããã®ãšã³ãžã³ã¯JavaScriptã³ãŒããã³ã³ãã¥ãŒã¿ãçè§£ã§ããæ©æ¢°èªã«ç¿»èš³ããŸãããããã®ãšã³ãžã³ã®äž»ãªç®æšã¯ãJavaScriptã³ãŒããå¯èœãªéãéãå®è¡ããããšã§ãã
æé©åãšã¯ãã³ãŒãã®ããã©ãŒãã³ã¹ãåäžãããããã«çšããããæè¡ãæãåºç¯ãªçšèªã§ããããã«ã¯ãå®è¡æéã®ççž®ãã¡ã¢ãªäœ¿çšéã®æå°åãå¿çæ§ã®åäžãå«ãŸããŸããJavaScriptãšã³ãžã³ã¯ã以äžãå«ãæ§ã ãªæé©åæŠç¥ãæ¡çšããŠããŸãã
- ããŒã¹ïŒè§£æïŒïŒ JavaScriptã³ãŒããæœè±¡æ§ææšïŒASTïŒã«åè§£ããŸãã
- ã€ã³ã¿ãŒããªããŒã·ã§ã³ïŒè§£éïŒïŒ æåã¯ã³ãŒããäžè¡ãã€å®è¡ããŸãã
- Just-In-TimeïŒJITïŒã³ã³ãã€ã«ïŒ é »ç¹ã«å®è¡ãããã³ãŒãã»ã¯ã·ã§ã³ïŒããããã¹ïŒãç¹å®ããå®è¡æã«é«åºŠã«æé©åãããæ©æ¢°èªã«ã³ã³ãã€ã«ããŸããããã§V8ã®ææ©çæé©åãç䟡ãçºæ®ããŸãã
- ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ïŒ ãªããžã§ã¯ãã倿°ãå æããæªäœ¿çšã®ã¡ã¢ãªãååããããšã§ãã¡ã¢ãªãå¹ççã«ç®¡çããŸãã
Just-In-TimeïŒJITïŒã³ã³ãã€ã«ã®åœ¹å²
JITã³ã³ãã€ã«ã¯ãçŸä»£ã®JavaScriptãšã³ãžã³ã®ããã©ãŒãã³ã¹ã®åºç€ã§ããã³ãŒããäžè¡ãã€å®è¡ããåŸæ¥ã®ã€ã³ã¿ãŒããªããŒã·ã§ã³ãšã¯ç°ãªããJITã³ã³ãã€ã«ã¯é »ç¹ã«å®è¡ãããã³ãŒãã»ã°ã¡ã³ãïŒããããã³ãŒãããšããŠç¥ãããïŒãç¹å®ããå®è¡æã«é«åºŠã«æé©åãããæ©æ¢°èªã«ã³ã³ãã€ã«ããŸãããã®ã³ã³ãã€ã«ãããã³ãŒãã¯ãè§£éãããã³ãŒããããã¯ããã«é«éã«å®è¡ã§ããŸããV8ã®JITã³ã³ãã€ã©ã¯ãJavaScriptã³ãŒãã®æé©åã«ãããŠéèŠãªåœ¹å²ãæãããŸããããã«ã¯ã以äžã®ãããªæ§ã ãªæè¡ã䜿çšãããŸãã
- åæšè«ïŒ 倿°ã®ããŒã¿åãäºæž¬ããããå¹ççãªæ©æ¢°èªãçæããŸãã
- ã€ã³ã©ã€ã³ãã£ãã·ã¥ïŒ ããããã£ã¢ã¯ã»ã¹ã®çµæããã£ãã·ã¥ããŠããªããžã§ã¯ãã®ã«ãã¯ã¢ãããé«éåããŸãã
- ææ©çæé©åïŒ ãã®æçš¿ã®çŠç¹ã§ããã³ãŒããã©ã®ããã«æ¯ãèãããä»®å®ãããããã®ä»®å®ã«åºã¥ããŠæé©åãè¡ãããšã§ãå€§å¹ ãªããã©ãŒãã³ã¹åäžã«ã€ãªããå¯èœæ§ããããŸãã
ææ©çæé©åã®è©³çް
ææ©çæé©åã¯ãJITã³ã³ãã€ã«ã次ã®ã¬ãã«ã«åŒãäžãã匷åãªæè¡ã§ããã³ãŒããå®å šã«å®è¡ãããã®ãåŸ ã£ãŠãã®æ¯ãèããçè§£ããã®ã§ã¯ãªããV8ã¯JITã³ã³ãã€ã©ãéããŠãã³ãŒããã©ã®ããã«æ¯ãèããã«ã€ããŠ*äºæž¬*ïŒææ©ïŒãè¡ããŸãããããã®äºæž¬ã«åºã¥ããŠãã³ãŒããç©æ¥µçã«æé©åããŸããäºæž¬ãæ£ãããã°ãã³ãŒãã¯ä¿¡ããããªãã»ã©é«éã«å®è¡ãããŸããäºæž¬ãééã£ãŠããå ŽåãV8ã«ã¯ã³ãŒãããè±æé©åãããæé©å床ãäœãïŒãããæ©èœããïŒããŒãžã§ã³ã«æ»ãã¡ã«ããºã ããããŸãããã®ããã»ã¹ã¯ãã°ãã°ããã€ã«ã¢ãŠãããšåŒã°ããŸãã
ãã®ä»çµã¿ãã¹ããããã€ã¹ãããã§èª¬æããŸãã
- äºæž¬ïŒ V8ãšã³ãžã³ã¯ã³ãŒããåæãã倿°ã®ããŒã¿åãããããã£ã®å€ãããã°ã©ã ã®å¶åŸ¡ãããŒãªã©ã«ã€ããŠä»®å®ãç«ãŠãŸãã
- æé©åïŒ ãããã®äºæž¬ã«åºã¥ããŠããšã³ãžã³ã¯é«åºŠã«æé©åãããæ©æ¢°èªãçæããŸãããã®ã³ã³ãã€ã«ãããã³ãŒãã¯ãæåŸ ãããæ¯ãèããæŽ»çšããŠå¹ççã«å®è¡ãããããã«èšèšãããŠããŸãã
- å®è¡ïŒ æé©åãããã³ãŒããå®è¡ãããŸãã
- æ€èšŒïŒ å®è¡äžããšã³ãžã³ã¯ã³ãŒãã®å®éã®æ¯ãèããåžžã«ç£èŠããŸããæåã®äºæž¬ãæ£ãããã©ããããã§ãã¯ããŸãã
- è±æé©åïŒãã€ã«ã¢ãŠãïŒïŒ äºæž¬ãééã£ãŠããããšã倿ããå ŽåïŒäŸãã°ã倿°ãäºæããåã倿Žããæåã®ä»®å®ã«éåããå ŽåïŒãæé©åãããã³ãŒãã¯ç Žæ£ããããšã³ãžã³ã¯æé©å床ã®äœãããŒãžã§ã³ïŒå€ãã®å Žåãè§£éãããããŒãžã§ã³ãŸãã¯ä»¥åã«ã³ã³ãã€ã«ãããããŒãžã§ã³ïŒã«æ»ããŸãããã®åŸããšã³ãžã³ã¯èгå¯ãããå®éã®æ¯ãèãã«åºã¥ãæ°ããªæŽå¯ãåŸãŠãåæé©åãè¡ãããšããããŸãã
ææ©çæé©åã®æå¹æ§ã¯ããšã³ãžã³ã®äºæž¬ã®æ£ç¢ºãã«ããã£ãŠããŸããäºæž¬ãæ£ç¢ºã§ããã°ããã»ã©ãããã©ãŒãã³ã¹ã®åäžã¯å€§ãããªããŸããV8ã¯äºæž¬ã®ç²ŸåºŠãåäžãããããã«ã以äžã®ãããªæ§ã ãªæè¡ã䜿çšããŠããŸãã
- åãã£ãŒãããã¯ïŒ å®è¡æã«ééãã倿°ãããããã£ã®åã«é¢ããæ å ±ãåéããŸãã
- ã€ã³ã©ã€ã³ãã£ãã·ã¥ïŒICïŒïŒ ããããã£ã¢ã¯ã»ã¹ã«é¢ããæ å ±ããã£ãã·ã¥ããŠããªããžã§ã¯ãã®ã«ãã¯ã¢ãããé«éåããŸãã
- ãããã¡ã€ãªã³ã°ïŒ ã³ãŒãã®å®è¡ãã¿ãŒã³ãåæããŠãããããã¹ãæé©åã®æ©æµãåããé åãç¹å®ããŸãã
ææ©çæé©åã®å®çšäŸ
ææ©çæé©åãã³ãŒãã®ããã©ãŒãã³ã¹ãã©ã®ããã«åäžãããããå ·äœçãªäŸãèŠãŠã¿ãŸããããæ¬¡ã®JavaScriptã³ãŒãã¹ãããããèããŠã¿ãŠãã ããã
function add(a, b) {
return a + b;
}
let result = add(5, 10);
ãã®ç°¡åãªäŸã§ã¯ãV8ã¯æåã«`a`ãš`b`ãæ°å€ã§ãããšäºæž¬ãããããããŸããããã®äºæž¬ã«åºã¥ããŠã2ã€ã®æ°å€ãå ç®ããããã®é«åºŠã«æé©åãããæ©æ¢°èªãçæã§ããŸããããå®è¡äžã«`a`ã`b`ãå®éã«ã¯æååã§ããããšãæããã«ãªã£ãå ŽåïŒäŸïŒ`add("5", "10")`ïŒããšã³ãžã³ã¯åã®äžäžèŽãæ€åºããã³ãŒããè±æé©åããŸãã颿°ã¯é©åãªååŠçã§åã³ã³ãã€ã«ãããçµæãšããŠé ããªããŸãããæ£ããæååé£çµãè¡ãããŸãã
äŸ2ïŒããããã£ã¢ã¯ã»ã¹ãšã€ã³ã©ã€ã³ãã£ãã·ã¥
ãªããžã§ã¯ãã®ããããã£ã¢ã¯ã»ã¹ãå«ããããè€éãªã·ããªãªãèããŠã¿ãŸãããã
function getFullName(person) {
return person.firstName + " " + person.lastName;
}
const person1 = { firstName: "John", lastName: "Doe" };
const person2 = { firstName: "Jane", lastName: "Smith" };
let fullName1 = getFullName(person1);
let fullName2 = getFullName(person2);
ãã®å ŽåãV8ã¯æåã«`person`ãªããžã§ã¯ããåžžã«`firstName`ãš`lastName`ãšããããããã£ãæã¡ãããããæååã§ãããšä»®å®ãããããããŸãããã€ã³ã©ã€ã³ãã£ãã·ã¥ã䜿çšããŠã`person`ãªããžã§ã¯ãå ã®`firstName`ãš`lastName`ããããã£ã®ã¢ãã¬ã¹ãä¿åããŸããããã«ãããåŸç¶ã®`getFullName`ã®åŒã³åºãã§ã®ããããã£ã¢ã¯ã»ã¹ãé«éåãããŸãããããããæç¹ã§`person`ãªããžã§ã¯ãã«`firstName`ã`lastName`ããããã£ããªãã£ããããããã®åã倿Žããããããå ŽåãV8ã¯ççŸãæ€åºããã€ã³ã©ã€ã³ãã£ãã·ã¥ãç¡å¹ã«ããè±æé©åãåŒãèµ·ãããŠãããé ãã§ããæ£ããã«ãã¯ã¢ãããè¡ããŸãã
ææ©çæé©åã®å©ç¹
ææ©çæé©åã®å©ç¹ã¯æ°å€ããããããé«éã§å¿çæ§ã®é«ããŠã§ãäœéšã«å€§ããè²¢ç®ããŸãã
- ããã©ãŒãã³ã¹ã®åäžïŒ äºæž¬ãæ£ç¢ºãªå Žåãææ©çæé©åã¯ç¹ã«é »ç¹ã«å®è¡ãããã³ãŒãã»ã¯ã·ã§ã³ã§å€§å¹ ãªããã©ãŒãã³ã¹åäžããããããŸãã
- å®è¡æéã®ççž®ïŒ äºæž¬ãããæ¯ãèãã«åºã¥ããŠã³ãŒããæé©åããããšã§ããšã³ãžã³ã¯JavaScriptã³ãŒãã®å®è¡ã«ãããæéãççž®ã§ããŸãã
- å¿çæ§ã®åäžïŒ ã³ãŒãå®è¡ãéããªãããšã§ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ã®å¿çæ§ãé«ãŸããããã¹ã ãŒãºãªäœéšãæäŸãããŸããããã¯ç¹ã«è€éãªãŠã§ãã¢ããªã±ãŒã·ã§ã³ãã²ãŒã ã§é¡èã§ãã
- å¹ççãªãªãœãŒã¹å©çšïŒ æé©åãããã³ãŒãã¯ãå€ãã®å Žåãããå°ãªãã¡ã¢ãªãšCPUãµã€ã¯ã«ãå¿ èŠãšããŸãã
課é¡ãšèæ ®äºé
匷åã§ããäžæ¹ãææ©çæé©åã«ã¯èª²é¡ããããŸãã
- è€éãïŒ æŽç·Žãããææ©çæé©åã·ã¹ãã ãå®è£ ããç¶æããããšã¯è€éã§ããã³ãŒãã®æ éãªåæãæ£ç¢ºãªäºæž¬ã¢ã«ãŽãªãºã ããããŠå ç¢ãªè±æé©åã¡ã«ããºã ãå¿ èŠã§ãã
- è±æé©åã®ãªãŒããŒãããïŒ äºæž¬ãé »ç¹ã«ééã£ãŠããå Žåãè±æé©åã®ãªãŒããŒããããããã©ãŒãã³ã¹ã®åäžãçžæ®ºããå¯èœæ§ããããŸããè±æé©åããã»ã¹èªäœããªãœãŒã¹ãæ¶è²»ããŸãã
- ãããã°ã®é£ããïŒ ææ©çæé©åã«ãã£ãŠçæãããé«åºŠã«æé©åãããã³ãŒãã¯ããããã°ãããå°é£ã«ãªãããšããããŸããã³ãŒããäºæããæ¯ãèãçç±ãçè§£ããã®ã¯é£ããå ŽåããããŸããéçºè ã¯ãããã°ããŒã«ã䜿çšããŠãšã³ãžã³ã®æ¯ãèããåæããå¿ èŠããããŸãã
- ã³ãŒãã®å®å®æ§ïŒ äºæž¬ãäžè²«ããŠééã£ãŠãããã³ãŒããåžžã«è±æé©åãããå Žåãã³ãŒãã®å®å®æ§ãæªåœ±é¿ãåããå¯èœæ§ããããŸãã
éçºè ã®ããã®ãã¹ããã©ã¯ãã£ã¹
éçºè ã¯ãV8ãããæ£ç¢ºãªäºæž¬ãè¡ããææ©çæé©åã®å©ç¹ãæå€§åããã®ã«åœ¹ç«ã€ãã©ã¯ãã£ã¹ãæ¡çšããããšãã§ããŸãã
- äžè²«æ§ã®ããã³ãŒããæžãïŒ äžè²«ããããŒã¿åã䜿çšããŸããäºæããªãåã®å€æŽïŒäŸïŒåã倿°ãæ°å€ãšããŠäœ¿çšããåŸã«æååãšããŠäœ¿çšããïŒãé¿ããŸããè±æé©åãæå°éã«æããããã«ãã³ãŒããã§ããã ãåå®å®ã«ä¿ã¡ãŸãã
- ããããã£ã¢ã¯ã»ã¹ãæå°éã«æããïŒ ã«ãŒãå ãé »ç¹ã«å®è¡ãããã³ãŒãã»ã¯ã·ã§ã³ã§ã®ããããã£ã¢ã¯ã»ã¹ã®æ°ãæžãããŸããé »ç¹ã«ã¢ã¯ã»ã¹ãããããããã£ããã£ãã·ã¥ããããã«ããŒã«ã«å€æ°ã䜿çšããããšãæ€èšããŠãã ããã
- åçãªã³ãŒãçæãé¿ããïŒ `eval()`ã`new Function()`ã®äœ¿çšã¯ããšã³ãžã³ãã³ãŒãã®æ¯ãèããäºæž¬ããã®ãé£ãããããããæå°éã«æããŸãã
- ã³ãŒãããããã¡ã€ãªã³ã°ããïŒ ãããã¡ã€ãªã³ã°ããŒã«ïŒäŸïŒChrome DevToolsïŒã䜿çšããŠãããã©ãŒãã³ã¹ã®ããã«ããã¯ãæé©åãæãæçãªé åãç¹å®ããŸããã³ãŒããã©ãã§æãæéãè²»ãããŠããããçè§£ããããšãéèŠã§ãã
- JavaScriptã®ãã¹ããã©ã¯ãã£ã¹ã«åŸãïŒ ã¯ãªãŒã³ã§èªã¿ããããããæ§é åãããã³ãŒããæžããŸããããã¯äžè¬çã«ããã©ãŒãã³ã¹ã«æçã§ããããšã³ãžã³ãæé©åãããããªããŸãã
- ããããã¹ãæé©åããïŒ æãé »ç¹ã«å®è¡ãããã³ãŒãã»ã¯ã·ã§ã³ïŒãããããã¹ãïŒã«æé©åã®åªåãéäžãããŸããããã§ææ©çæé©åã®å©ç¹ãæãé¡èã«ãªããŸãã
- TypeScriptïŒãŸãã¯ä»ã®åä»ãJavaScript代æ¿ïŒã䜿çšããïŒ TypeScriptã«ããéçåä»ãã¯ã倿°ã®ããŒã¿åã«é¢ããããå€ãã®æ å ±ãæäŸããããšã§ãV8ãšã³ãžã³ãå©ããããšãã§ããŸãã
ã°ããŒãã«ãªåœ±é¿ãšå°æ¥ã®åå
ææ©çæé©åã®æ©æµã¯äžçäžã§æããããŸããæ±äº¬ã§ãŠã§ããé²èЧãããŠãŒã¶ãŒããããªãªããžã£ãã€ãã§ãŠã§ãã¢ããªã±ãŒã·ã§ã³ã«ã¢ã¯ã»ã¹ãããŠãŒã¶ãŒãŸã§ãããéããããå¿çæ§ã®é«ããŠã§ãäœéšã¯æ®éçã«æãŸããŠããŸãããŠã§ããé²åãç¶ããã«ã€ããŠãããã©ãŒãã³ã¹æé©åã®éèŠæ§ã¯å¢ãã°ããã§ãã
å°æ¥ã®ååïŒ
- äºæž¬ã¢ã«ãŽãªãºã ã®ç¶ç¶çãªæ¹è¯ïŒ ãšã³ãžã³éçºè ã¯ãææ©çæé©åã§äœ¿çšãããäºæž¬ã¢ã«ãŽãªãºã ã®ç²ŸåºŠãšæŽç·ŽåºŠãç¶ç¶çã«åäžãããŠããŸãã
- é«åºŠãªè±æé©åæŠç¥ïŒ ããã©ãŒãã³ã¹ã®ããã«ãã£ãæå°éã«æããããã®ãããã¹ããŒããªè±æé©åæŠç¥ã®æ¢æ±ã
- WebAssemblyïŒWasmïŒãšã®çµ±åïŒ Wasmã¯ãŠã§ãåãã«èšèšããããã€ããªåœä»€åœ¢åŒã§ããWasmãããæ®åããã«ã€ããŠãJavaScriptããã³V8ãšã³ãžã³ãšã®çžäºäœçšãæé©åããããšã¯ãé²è¡äžã®éçºåéã§ããææ©çæé©åæè¡ã¯ãWasmã®å®è¡ã匷åããããã«é©å¿ãããå¯èœæ§ããããŸãã
- ãšã³ãžã³éã®æé©åïŒ ç°ãªãJavaScriptãšã³ãžã³ã¯ç°ãªãæé©åæè¡ã䜿çšããŠããŸãããã¢ã€ãã¢ã®åæãé²ãã§ããŸãããšã³ãžã³éçºè éã®ååãšç¥èå ±æã¯ããŠã§ããšã³ã·ã¹ãã å šäœã«å©çããããã鲿©ã«ã€ãªããå¯èœæ§ããããŸãã
çµè«
ææ©çæé©åã¯ãV8 JavaScriptãšã³ãžã³ã®äžå¿ã«ãã匷åãªæè¡ã§ãããäžçäžã®ãŠãŒã¶ãŒã«é«éã§å¿çæ§ã®é«ããŠã§ãäœéšãæäŸããäžã§éèŠãªåœ¹å²ãæãããŠããŸããã³ãŒãã®æ¯ãèãã«ã€ããŠç¥çãªäºæž¬ãè¡ãããšã§ãV8ã¯é«åºŠã«æé©åãããæ©æ¢°èªãçæããããã©ãŒãã³ã¹ã®åäžããããããŸããææ©çæé©åã«ã¯èª²é¡ã䌎ããŸããããã®å©ç¹ã¯åŠå®ã§ããŸãããææ©çæé©åãã©ã®ããã«æ©èœããããçè§£ãããã¹ããã©ã¯ãã£ã¹ãæ¡çšããããšã§ãéçºè ã¯æé©ãªããã©ãŒãã³ã¹ãçºæ®ããã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã«ãšã£ãŠããã¹ã ãŒãºã§é åçãªãŠãŒã¶ãŒäœéšã«è²¢ç®ããJavaScriptã³ãŒããæžãããšãã§ããŸãããŠã§ãæè¡ã鲿©ãç¶ããäžã§ãææ©çæé©åã®ç¶ç¶çãªé²åã¯ããŠã§ãã誰ã«ãšã£ãŠããã©ãã§ãé«éã§ã¢ã¯ã»ã¹ããããä¿ã€ããã«äžå¯æ¬ ã§ãã